package entity

import (
	"fmt"
	"sync"
	"sync/atomic"

	"gitee.com/night-tc/gobige/threads"
)

/*
对象管理器
用于管理对象的集合
一般它不会独立使用，需要组合到后带对象上
如service、space 类型的对应
一些接口也需要他们来实现
*/

// 对象管理器
type Entities struct {
	// DelayCallHost //支持回调

	//成员个数
	entityCount atomic.Int32
	//子类是否创建协程
	isMutilThread bool

	entities       sync.Map //所有Entity key=entityID, value=iserver.IEntity
	entitiesByType sync.Map //所有Entity,Type分组 EntityID为Key key=entityType, value=sync.Map:(key=entityID, value=iserver.IEntity)
	entitiesByDBID sync.Map //所有Entity,Type分组 DBID为Key     key=entityType, value=sync.Map:(key=DBID, value=iserver.IEntity)
	entitiesGroup  sync.Map //key=groupID, value=sync.Map:(key=entityID, value=iserver.IEntity)
	entitiesChan   sync.Map //拥有独立协程的Entity key=entityID, value=entity.iEntityCtrl && (iserver.IEntity)

	//后代实际对象的引用
	realPtr IEntities
	//用与管理子协程的
	thgo *threads.ThreadGo
}

func NewEntities(isMutilThread bool, real IEntities, thgo *threads.ThreadGo) *Entities {
	result := new(Entities)
	result.isMutilThread = isMutilThread
	result.realPtr = real
	// if msgh != nil {
	// 	result.MsgHandlers = msgh
	// } else {
	// 	result.MsgHandlers = msghandler.NewMsgHandlers()
	// }
	result.thgo = threads.NewThreadGoByGo(thgo)

	return result
}

// 字符串化信息
func (this *Entities) String() string {
	return fmt.Sprintf("[Entities count:%d]",
		this.entityCount.Load())
}

///////////////////////////////////////
/* 属性 */

// 本空间的ID 默认为0，表示自己是service层的管理器，如果是space，对应的space会重载这个接口
func (this *Entities) GetEntityID() uint64 {
	return 0
}

// 操作子协程的管理器
func (this *Entities) GetThreadGo() *threads.ThreadGo {
	return this.thgo
}

/* 属性 */
///////////////////////////////////////
